#pragma once

#include <iostream>
#include <mutex>

namespace ccc
{
    // 懒汉模式
    class Signal
    {
    private:
        // 构造函数私有化
        Signal()
        {
        }

        // 删除拷贝构造
        Signal(const Signal &) = delete;

    public:
        static Signal *getInstance()
        {
            // 双检查
            if (_sigptr == nullptr)
            {
                // 加锁保护
                pthread_mutex_lock(&_mtx);
                if (_sigptr == nullptr)
                {
                    std::cout << "创建了一个单例对象" << std::endl;
                    _sigptr = new Signal();
                }
                pthread_mutex_unlock(&_mtx);
            }

            return _sigptr;
        }

        void print()
        {
            std::cout << "Hello Signal!" << std::endl;
        }

    private:
        // 静态指针
        static Signal *_sigptr;
        static pthread_mutex_t _mtx;
    };

    // 初始化静态指针
    Signal *Signal::_sigptr = nullptr;

    // 初始化互斥锁
    pthread_mutex_t Signal::_mtx = PTHREAD_MUTEX_INITIALIZER;
}